/*
* Copyright (C) 2015 Arles. All rights reserved.
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.arles.swissmanager.test.util;
import android.support.annotation.IdRes;
import android.support.test.espresso.PerformException;
import android.support.test.espresso.UiController;
import android.support.test.espresso.ViewAction;
import android.support.test.espresso.matcher.ViewMatchers;
import android.support.test.espresso.util.HumanReadables;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
/**
* Created by Admin on 22.07.2015.
*/
public class RecyclerViewMatcherBase {
public static <VH extends RecyclerView.ViewHolder> ViewAction actionOnItemViewAtPosition(int position,
@IdRes
int viewId,
ViewAction viewAction) {
return new ActionOnItemViewAtPositionViewAction(position, viewId, viewAction);
}
private static final class ActionOnItemViewAtPositionViewAction<VH extends RecyclerView
.ViewHolder>
implements
ViewAction {
private final int position;
private final ViewAction viewAction;
private final int viewId;
private ActionOnItemViewAtPositionViewAction(int position,
@IdRes int viewId,
ViewAction viewAction) {
this.position = position;
this.viewAction = viewAction;
this.viewId = viewId;
}
public Matcher<View> getConstraints() {
return Matchers.allOf(new Matcher[] {
ViewMatchers.isAssignableFrom(RecyclerView.class), ViewMatchers.isDisplayed()
});
}
public String getDescription() {
return "actionOnItemAtPosition performing ViewAction: "
+ this.viewAction.getDescription()
+ " on item at position: "
+ this.position;
}
public void perform(UiController uiController, View view) {
RecyclerView recyclerView = (RecyclerView) view;
(new ScrollToPositionViewAction(this.position)).perform(uiController, view);
uiController.loopMainThreadUntilIdle();
View targetView = recyclerView.getChildAt(this.position).findViewById(this.viewId);
if (targetView == null) {
throw (new PerformException.Builder()).withActionDescription(this.toString())
.withViewDescription(
HumanReadables.describe(view))
.withCause(new IllegalStateException(
"No view with id "
+ this.viewId
+ " found at position: "
+ this.position))
.build();
} else {
this.viewAction.perform(uiController, targetView);
}
}
}
private static final class ScrollToPositionViewAction implements ViewAction {
private final int position;
private ScrollToPositionViewAction(int position) {
this.position = position;
}
public Matcher<View> getConstraints() {
return Matchers.allOf(new Matcher[] {
ViewMatchers.isAssignableFrom(RecyclerView.class), ViewMatchers.isDisplayed()
});
}
public String getDescription() {
return "scroll RecyclerView to position: " + this.position;
}
public void perform(UiController uiController, View view) {
RecyclerView recyclerView = (RecyclerView) view;
recyclerView.scrollToPosition(this.position);
}
}
public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) {
return new RecyclerViewMatcher(recyclerViewId);
}
}